#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
/*
算法思路：岛为点，岛中间的桥危险则无边，不危险则有边
则连通块中无危险路径
x号连通块大小为Cx时
每种修桥方案会连通两个连通块a和b
增加路径数Ca*Cb
即求Ca*Cb的最大值
*/
const ll N=200009;
struct Bridge{
    ll a,b,c;
} bridge[N];
bool cmp(const Bridge&a,const Bridge&b){
    return a.c<b.c;
}
ll n,ans=0,id[N],C[N];////id[u]代表u的父亲，如果u是根节点则id[u]=u;C[ru]代表u所在连通块节点的个数，其中ru=root(u)
ll root(ll u){//root(a)代表a的根节点
    return id[u]==u?u:id[u]=root(id[u]);
}
void solve(){
    ll addnum=0;
    for(ll u=1;u<=n;u++) id[u]=u;//未连通时每个节点都是根节点
    for(ll r=1;r<=n;r++) C[r]=1;//每个节点所在连通块都只有本身
    for(ll k=1;k<=n-1;k++) cin>>bridge[k].a>>bridge[k].b>>bridge[k].c;
    sort(bridge+1,bridge+n,cmp);
    for(ll k=1;k<=n-1;k++){
        ll a=bridge[k].a,b=bridge[k].b,c=bridge[k].c;
        ll ra=root(a);
        ll rb=root(b);
        if(ra==rb) continue;//必须保证a所在连通块与b所在连通块不连通
        if(c==0){//如果a与b间有边，则a所在连通块与b所在连通块连通
            C[rb]+=C[ra];
            C[ra]=1;
            id[ra]=rb;//令a的根节点为b的根节点的儿子
        }else //a与b间无边但可以加边
            addnum=max(addnum,C[ra]*C[rb]);//修桥后的最大增加路径
    }
    for(ll i=1;i<=n;i++) addnum+=(C[i]-1)*C[i]/2;
  	ans=n*(n-1)/2-addnum;
}
int main(){
    //freopen("bridge.in","r",stdin);
    //freopen("bridge.out","w",stdout);
    cin>>n;
    solve();
    cout<<ans<<endl;
    return 0;
}